#! /usr/bin/env python3
#GPIO按键控制LED (轮询方法)
# 导入树莓派GPIO控制库和时间库
import RPi.GPIO as GPIO
import time

# 设置GPIO引脚编号模式为BCM（使用GPIO编号而非board模式）
GPIO.setmode(GPIO.BCM)

# 定义硬件连接引脚
led = 21  # LED连接的GPIO引脚
bt = 20   # 按钮连接的GPIO引脚

# 初始化GPIO引脚模式
GPIO.setup(led, GPIO.OUT)    # 设置LED引脚为输出模式
GPIO.setup(bt, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # 设置按钮引脚为输入模式，启用内部上拉电阻，防止引脚值因干扰飘动

# 初始化
ledStatus = False  # LED状态（False为熄灭）
n = 1              # 按钮按下次数

try:#使用try，能够用Ctrl+C的方法中止While循环，执行cleanup清理GPIO.setup()的配置后退出
    # 主循环
    while True:
        time.sleep(0.01)  # 短暂延时减少CPU占用
        
        # 按钮检测逻辑
        if GPIO.input(bt) == GPIO.LOW:        # 首次检测到低电平（按钮被按下）
            time.sleep(0.03)                   # 等待30ms消除抖动
            if GPIO.input(bt) == GPIO.HIGH:    # 再次检测确认按钮已释放
                print('button pressed', n)     # 打印按钮按下和当前次数
                n += 1                         # 按钮按下计数器增加
                ledStatus = not ledStatus      # 切换LED状态
                
                # 根据新状态控制LED
                if ledStatus:
                    GPIO.output(led, GPIO.HIGH)  # 点亮LED
                else:
                    GPIO.output(led, GPIO.LOW)   # 熄灭LED

# 捕获键盘中断Ctrl+C
except KeyboardInterrupt:
    pass

# 程序退出前清理GPIO资源
GPIO.cleanup()